package com.bjtang.smartcrm;

import java.io.*;
import java.util.*;

public class WordFrequencyCount {
	public static void main(String[] args) throws IOException {
		String string = "";
		// 通过键值对的方式去分别存储字符串和出现的次数
		Map<String, Integer> map = new HashMap<String, Integer>();
		try {
			// 定义一个文件字节读取流，去读取磁盘中的文件
			FileInputStream fis = new FileInputStream("/home/bj-tang/Desktop/5.txt");
			// 创建一个BufferedReader的缓冲流，将字符流对象放入进去，提高读取的效率
			BufferedReader br = new BufferedReader(new InputStreamReader(fis));
			String temp = "";
			try {
				// 从BufferReader中读取下一行
				while ((temp = br.readLine()) != null) {
					string = string + temp;// 读取到的文件信息
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		// 创建一个spilt数组，分割字符串，来统计单词出现的次数
		String[] spilt = string.split(" ");
		for (int i = 0; i < spilt.length; i++) {

			// map.get(),通过键名来获取键值
			if (map.get(spilt[i]) == null) {
//map.put()将键值存储在map集合中，如果存在，那么就覆盖该键值，如果不存在就新建一个。
				map.put(spilt[i], 1);
			} else {
				int frequency = map.get(spilt[i]);
				map.put(spilt[i], ++frequency);
			}
		}
//利用TreeMap实现Comparator接口
		Comparator<Map.Entry<String, Integer>> valueComparator = new Comparator<Map.Entry<String, Integer>>() {

			public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
				/* return o1.getValue()-o2.getValue();//升序排序 */
				return o2.getValue() - o1.getValue();
				// 降序排序
			}
		};

// map转换成list进行排序，Entry是Map中的一个静态内部类，用来表示Map中的每个键值对，
		// 除非使用了静态导入import static java.util.Map.*，否则Map不可以省略。
		// map.EntrySet(),实现了Set接口，里面存放的是键值对.
		List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());

		// 排序

		Collections.sort(list, valueComparator);

// 默认情况下，TreeMap对key进行升序排序 

		System.out.println("------------map按照value降序排序--------------------");

		
		PrintStream psOld = System.out; // 保存原来的输出路径
		System.setOut(new PrintStream(new File("/home/bj-tang/Desktop/out3.txt")));// 设置输出重新定向到文件
		
		for (Map.Entry<String, Integer> entry : list) {
			System.out.println(entry.getKey() + ":" + entry.getValue());
		}

		System.setOut(psOld); // 恢复原来的输出路径


	}
}